home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 18 / AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso / PD / Spiele / lazymines / lazymines_src / counter.c < prev    next >
C/C++ Source or Header  |  1999-01-03  |  4KB  |  188 lines

  1. /*
  2.  * counter.c
  3.  * =========
  4.  * Implements digital counters.
  5.  *
  6.  * Copyright (C) 1994-1998 Håkan L. Younes (lorens@hem.passagen.se)
  7.  */
  8.  
  9. #include <stdio.h>
  10.  
  11. #include <exec/memory.h>
  12. #include <exec/types.h>
  13. #include <proto/exec.h>
  14. #include <proto/gadtools.h>
  15. #include <proto/graphics.h>
  16. #include <intuition/imageclass.h>
  17. #include <intuition/intuition.h>
  18. #include <intuition/screens.h>
  19. #include <proto/intuition.h>
  20.  
  21. #include "display_globals.h"
  22. #include "images.h"
  23. #include "counter.h"
  24.  
  25.  
  26. /* Data for counter object */
  27. struct counter {
  28.    struct Window  *win;
  29.    WORD            left;
  30.    WORD            top;
  31.    UWORD           value;
  32.    BOOL            digital;
  33. };
  34.  
  35.  
  36. /* Calculates the width that a digital counter will get */
  37. UWORD         /* calculated width */
  38. counter_width (void)
  39. {
  40.    return 3 * DIGITWIDTH + 6 * LINEWIDTH;
  41. }
  42.  
  43.  
  44. /* Calculates the height that a digital counter will get */
  45. UWORD          /* calculated height */
  46. counter_height (void)
  47. {
  48.    return DIGITHEIGHT + 4 * LINEHEIGHT;
  49. }
  50.  
  51.  
  52. /* Creates a new counter object */
  53. counter_ptr                   /* created counter */
  54. counter_init (
  55.    struct Window  *win,       /* window to use counter in */
  56.    WORD            left,      /* left offset */
  57.    WORD            top,       /* top offset */
  58.    UWORD           value,     /* initial value */
  59.    BOOL            digital)   /* digital counter? */
  60. {
  61.    counter_ptr   counter;
  62.    
  63.    
  64.    if (counter = AllocVec (sizeof (*counter), MEMF_PUBLIC))
  65.    {
  66.       counter->win = win;
  67.       counter->left = left;
  68.       counter->top = top;
  69.       counter->value = value;
  70.       counter->digital = digital;
  71.    }
  72.    
  73.    return counter;
  74. }
  75.  
  76.  
  77. /* Frees a counter object */
  78. void
  79. counter_free (
  80.    counter_ptr   counter)   /* counter to free */
  81. {
  82.    if (counter)
  83.       FreeVec (counter);
  84. }
  85.  
  86.  
  87. /* Reads the value of a counter */
  88. UWORD              /* the value */
  89. counter_value (
  90.    counter_ptr   counter)   /* counter to read value from */
  91. {
  92.    return counter->value;
  93. }
  94.  
  95.  
  96. /* Changes a counter's position */
  97. void
  98. counter_move (
  99.    counter_ptr   counter,   /* counter to move */
  100.    WORD          left,      /* new left offset */
  101.    WORD          top)       /* new top offset */
  102. {
  103.    counter->left = left;
  104.    counter->top = top;
  105. }
  106.  
  107.  
  108. /* Draws a counter */
  109. void
  110. counter_draw (
  111.    counter_ptr   counter,   /* counter to draw */
  112.    APTR          vi)        /* visual info */
  113. {
  114.    if (counter->digital)
  115.    {
  116.       ULONG   bgpen;
  117.       
  118.       
  119.       DrawBevelBox (counter->win->RPort,
  120.                     counter->left, counter->top,
  121.                     counter_width (), counter_height (),
  122.                     GT_VisualInfo, vi,
  123.                     GTBB_Recessed, TRUE,
  124.                     TAG_DONE);
  125.       
  126.       GetAttr (IA_BGPen, digit_images[0], &bgpen);
  127.       SetAPen (counter->win->RPort, bgpen);
  128.       RectFill (counter->win->RPort,
  129.                 counter->left + LINEWIDTH, counter->top + LINEHEIGHT,
  130.                 counter->left + counter_width () - LINEWIDTH - 1,
  131.                 counter->top + counter_height () - LINEHEIGHT - 1);
  132.    }
  133.    
  134.    counter_update (counter, counter->value);
  135. }
  136.  
  137.  
  138. /* Deletes a counter */
  139. void
  140. counter_delete (
  141.    counter_ptr   counter)   /* counter to delete */
  142. {
  143.    if (counter->digital)
  144.    {
  145.       SetAPen (counter->win->RPort, gui_pens[BACKGROUNDPEN]);
  146.       RectFill (counter->win->RPort,
  147.                 counter->left, counter->top,
  148.                 counter->left + counter_width () - 1,
  149.                 counter->top + counter_height () - 1);
  150.    }
  151. }
  152.  
  153.  
  154. void
  155. counter_update (
  156.    counter_ptr   counter,
  157.    UWORD         value)
  158. {
  159.    register UBYTE   i;
  160.    char             value_str[4];
  161.    
  162.    
  163.    counter->value = value;
  164.    if (counter->value > 999)
  165.       sprintf (value_str, "%03d", counter->value % 1000);
  166.    else
  167.       sprintf (value_str, "%3d", counter->value);
  168.    
  169.    for (i = 0; i < 3; ++i)
  170.    {
  171.       if (counter->digital)
  172.       {
  173.          DrawImageState (counter->win->RPort,
  174.                          digit_images[((value_str[i] == ' ') ?
  175.                                        EMPTYDIGIT : value_str[i] - '0')],
  176.                          counter->left + 2 * LINEWIDTH +
  177.                          i * (DIGITWIDTH + LINEWIDTH),
  178.                          counter->top + 2 * LINEHEIGHT,
  179.                          IDS_NORMAL, NULL);
  180.       }
  181.       else
  182.       {
  183.          counter->win->Title[counter->left + i] = value_str[i];
  184.          SetWindowTitles (counter->win, counter->win->Title, (UBYTE *)~0);
  185.       }
  186.    }
  187. }
  188.